package br.com.cogerh.sidec.util;

import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.List;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

import br.com.cogerh.sidec.model.Compromisso;
import br.com.cogerh.sidec.model.LogEmail;
import br.com.cogerh.sidec.view.LogEmailRN;

public class Email {

	public static final String TIPO_TEXTO_PLAIN = "text/plain; charset=";
	public static final String TIPO_TEXTO_HTML = "text/html; charset=";

	private String protocolo;
	private String hostSmtp;
	private String porta;
	private String autenticado;
	private String nomeUsuario;
	private String usuario;
	private String senha;
	private String charsetMail;
	private String tipoTextoEmail;
	private String trust;
	private String tls;

	private Properties propriedades;
	private Session session;

	private Message mensagem;
	private MimeBodyPart textoMensagemCompleta;
	private Multipart parteMensagemCompleta;
	private String assunto;
	private String corpoEmail;
	private List<String> destinatarios;
	private List<String> anexos;

	public Email() {
		propriedades = new Properties();
	}

	public Email(String protocolo, String hostSmtp, String porta,
			String autenticado, String usuario, String senha,
			String charsetMail, String tipoTextoEmail, String nomeUsuario,
			String tls, String trust) {
		this.protocolo = protocolo;
		this.hostSmtp = hostSmtp;
		this.porta = porta;
		this.autenticado = autenticado;
		this.usuario = usuario;
		this.senha = senha;
		this.charsetMail = charsetMail;
		this.tipoTextoEmail = tipoTextoEmail;
		this.nomeUsuario = nomeUsuario;
		this.trust = trust;
		this.tls = tls;
		propriedades = new Properties();
	}

	public void conectar() {

		propriedades.setProperty("mail.transport.protocol", "smtp");
		propriedades.setProperty("mail.host", getHostSmtp());
		propriedades.setProperty("mail.smtp.auth", getAutenticado());
		propriedades.setProperty("mail.smtp.port", getPorta());
		propriedades.setProperty("mail.mime.charset", getCharsetMail());
		propriedades.setProperty("mail.smtp.starttls.enable", getTls());
		propriedades.setProperty("mail.smtp.ssl.trust", getTrust());

		Authenticator auth = new Authenticator() {
			public PasswordAuthentication getPasswordAuthentication() {
				return new PasswordAuthentication(getUsuario(), getSenha());
			}
		};

		session = Session.getDefaultInstance(propriedades, auth);

		session.setDebug(true);
	}

	public void prepararEmail(String assunto, String corpoEmail,
			List<String> destinatarios, List<String> anexos) {

		this.assunto = assunto;
		this.corpoEmail = corpoEmail;
		this.destinatarios = destinatarios;
		this.anexos = anexos;

		try {
			mensagem = new MimeMessage(session);
			mensagem.setFrom(new InternetAddress(getUsuario(), getNomeUsuario()));
			mensagem.setSubject(getAssunto());
			mensagem.setSentDate(new Date());

			if (destinatarios != null && !destinatarios.isEmpty()) {
				boolean first = true;
				for (String destinatario : destinatarios) {
					if (first) {
						mensagem.addRecipient(
								Message.RecipientType.TO,
								new InternetAddress(destinatario,destinatario));
						first = false;
					} else {
						mensagem.addRecipient(
								Message.RecipientType.CC,
								new InternetAddress(destinatario, destinatario));
					}
				}
			}

			textoMensagemCompleta = new MimeBodyPart();
			textoMensagemCompleta.setContent(getCorpoEmail(),
					getTipoTextoEmail() + "\"ISO-8859-1\"");

			parteMensagemCompleta = new MimeMultipart();
			parteMensagemCompleta.addBodyPart(textoMensagemCompleta);
			if (anexos != null & !anexos.isEmpty()) {
				for (int index = 0; index < anexos.size(); index++) {
					MimeBodyPart tempMimeBodyPart = new MimeBodyPart();
					FileDataSource fds = new FileDataSource(anexos.get(index)
							.toString());
					tempMimeBodyPart.setDataHandler(new DataHandler(fds));
					tempMimeBodyPart.setFileName(fds.getName());
					parteMensagemCompleta.addBodyPart(tempMimeBodyPart);
				}
			}

			mensagem.setContent(parteMensagemCompleta);

		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (MessagingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	public void enviar(Compromisso compromisso) {
		LogEmailRN logEmailRN = new LogEmailRN();
		LogEmail logEmail = new LogEmail();
		logEmail.setData(new Date());
		logEmail.setEmail(compromisso.getPessoa().getEmail());
		logEmail.setCompromisso(compromisso);
		
		try {
			Transport.send(mensagem);
			logEmailRN.salvar(logEmail);
			
		} catch (MessagingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		
	}

	public String getProtocolo() {
		return protocolo;
	}

	public void setProtocolo(String protocolo) {
		this.protocolo = protocolo;
	}

	public String getHostSmtp() {
		return hostSmtp;
	}

	public void setHostSmtp(String hostSmtp) {
		this.hostSmtp = hostSmtp;
	}

	public String getPorta() {
		return porta;
	}

	public void setPorta(String porta) {
		this.porta = porta;
	}

	public String getAutenticado() {
		return autenticado;
	}

	public void setAutenticado(String autenticado) {
		this.autenticado = autenticado;
	}

	public String getUsuario() {
		return usuario;
	}

	public void setUsuario(String usuario) {
		this.usuario = usuario;
	}

	public String getSenha() {
		return senha;
	}

	public void setSenha(String senha) {
		this.senha = senha;
	}

	public String getCharsetMail() {
		return charsetMail;
	}

	public void setCharsetMail(String charsetMail) {
		this.charsetMail = charsetMail;
	}

	public String getNomeUsuario() {
		return nomeUsuario;
	}

	public void setNomeUsuario(String nomeUsuario) {
		this.nomeUsuario = nomeUsuario;
	}

	public String getAssunto() {
		return assunto;
	}

	public void setAssunto(String assunto) {
		this.assunto = assunto;
	}

	public List<String> getDestinatarios() {
		return destinatarios;
	}

	public void setDestinatarios(List<String> destinatarios) {
		this.destinatarios = destinatarios;
	}

	public List<String> getAnexos() {
		return anexos;
	}

	public void setAnexos(List<String> anexos) {
		this.anexos = anexos;
	}

	public String getTipoTextoEmail() {
		return tipoTextoEmail;
	}

	public void setTipoTextoEmail(String tipoTextoEmail) {
		this.tipoTextoEmail = tipoTextoEmail;
	}

	public MimeBodyPart getTextoMensagemCompleta() {
		return textoMensagemCompleta;
	}

	public void setTextoMensagemCompleta(MimeBodyPart textoMensagemCompleta) {
		this.textoMensagemCompleta = textoMensagemCompleta;
	}

	public Multipart getParteMensagemCompleta() {
		return parteMensagemCompleta;
	}

	public void setParteMensagemCompleta(Multipart parteMensagemCompleta) {
		this.parteMensagemCompleta = parteMensagemCompleta;
	}

	public String getCorpoEmail() {
		return corpoEmail;
	}

	public void setCorpoEmail(String corpoEmail) {
		this.corpoEmail = corpoEmail;
	}

	public String getTrust() {
		return trust;
	}

	public void setTrust(String trust) {
		this.trust = trust;
	}

	public String getTls() {
		return tls;
	}

	public void setTls(String tls) {
		this.tls = tls;
	}

}
